unit Agente;

interface
uses
  Ambiente, Estado, Acao;

type
  TAgente = class
    protected


      function Politica (s : TEstado) : TAcao;

    public
      constructor Create;

      function Percebe (E : TAmbiente)        : TEstado; virtual;
      function Age (E : TAmbiente; a: TAcao)  : TEstado;

      function EscolheAcao                    : TAcao; virtual; abstract;

      function NumeroDeAcoes : Integer;

  end;

implementation

{ TAgente }

function TAgente.Age(E: TAmbiente; a: TAcao): TEstado;
begin
  Result := E.NovoEstado(Self.Percebe(E), a);

end;

constructor TAgente.Create;
begin

end;

function TAgente.NumeroDeAcoes: Integer;
begin
  Result := TAcao.NumeroDeAcoes;
end;

function TAgente.Percebe(E: TAmbiente): TEstado;
begin
  Result :=  E.EstadoAgente;
end;

function TAgente.Politica(s: TEstado): TAcao;
begin

end;

end.
